home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / prolog / brklyprl.lha / Comp / varinit.pl < prev    next >
Text File  |  1989-04-14  |  2KB  |  56 lines

  1.  
  2. /* Copyright (C) 1988, 1989 Herve' Touati, Aquarius Project, UC Berkeley */
  3.  
  4. /* Copyright Herve' Touati, Aquarius Project, UC Berkeley */
  5.  
  6. % Adding initialization instructions
  7. % in disjunctions to variables which need it.
  8. % Result is a modified PartObj.
  9. % Traverses code once; passes over everything without
  10. % a passing glance except disjunctions.
  11.  
  12. % Must be used before tempalloc.
  13.  
  14. varinit(Forward, Backward, Partobj, Newobj) :-
  15.     xvarinit(Forward, Backward, Partobj, Newobj-[]), !.
  16.  
  17. xvarinit([_], _, X, R-L) :- linkify(X, R-L), !.
  18.  
  19. % The first two clauses traverse Forward, Backward, and PartObj
  20. % until a disjunction is found:
  21. xvarinit([_,FIn|Forward], [_,BIn|Backward], PartObj, NewObj) :-
  22.     '\+'(FIn=(_;_)), !, % Note: since Forward and Backward have identical
  23.                 % structure, only one must be tested.
  24.     xvarinit([FIn|Forward], [BIn|Backward], PartObj, NewObj), !.
  25. xvarinit(Forward, Backward, [G|PartObj], [G|NewObj]-Link) :-
  26.     '\+'(G=(_;_)), !,
  27.     xvarinit(Forward, Backward, PartObj, NewObj-Link), !.
  28.  
  29. % At this stage all three arguments have disjunctions:
  30. xvarinit([FLeft,(FA;FB),FRight|Forward],
  31.      [BLeft,(BA;BB),BRight|Backward], 
  32.      [(A;B)|PartObj], [(NA;NB)|NewObj]-Link) :- !,
  33.     diffv(FRight, FLeft, T),
  34.     intersectv(T, BRight, V),
  35.     dis_varinit(V, (FA;FB), (BA;BB), (A;B), (NA;NB)),
  36.     xvarinit([FRight|Forward], [BRight|Backward], PartObj, NewObj-Link), !.
  37.  
  38. dis_varinit(V, (FA;FB), (BA;BB), (A;B), (NA;NB)) :-
  39.     one_choice(V, FA, BA, A, NA),
  40.     dis_varinit(V, FB, BB, B, NB).
  41. dis_varinit(V, FA, BA, A, NA) :-
  42.     one_choice(V, FA, BA, A, NA).
  43.  
  44. one_choice(V, FA, BA, A, NA) :-
  45.     xvarinit(FA, BA, A, NA-Link),
  46.     last(FA, FLast),
  47.     diffv(V, FLast, InitVars),
  48.     add_init_list(InitVars, Link).
  49.  
  50.     add_init_list([], []) :- !.
  51.     add_init_list(InitVars, [InitInstr]) :- init_list(InitVars, InitInstr).
  52.  
  53. init_list([V|Vars], [put(variable,V,V)|Rest]-Link) :-
  54.     init_list(Vars, Rest-Link).
  55. init_list([], Link-Link).
  56.